阿里高级技术专家邱小侠:微服务架构的理论基础 - 康威定律
读完需要
10分钟速读仅需 4 分钟
邱小侠,阿里巴巴集团客户体验事业群高级技术专家,阿里花名肥侠。2014年加入阿里巴巴,现在负责客户体验驱动及创新中心有关商家业务的开发工作。负责开发了商家维权中心和商家品控平台,同时也负责集团在线工作台和知识库的研发工作。擅长Java核心技术、分布式系统与计算、开发框架与中间件、项目管理与软件工程和架构。
1
概述
关于微服务的介绍,网上已经有很多文章了。
微服务大家都在追,也都觉得很对,但是似乎没有很充足的理论基础说明这是正确的,给人的感觉是 不明觉厉 。前段时间看了 Mike Amundsen 《远距离条件下的康威定律——分布式世界中实现团队构建》(是 Design RESTful API 的作者)一个分享,觉得很有帮助,结合自己的一些思考,整理了该演讲的内容。
可能出乎很多人意料之外的一个事实是,微服务很多核心理念其实在半个世纪前的一篇文章中就被阐述过了,而且这篇文章中的很多论点在软件开发飞速发展的这半个世纪中竟然一再被验证,这就是康威定律(Conway's Law)。
Organizations which design systems are constrained to produce designs which are copies of the communication structures of these organizations. - Melvin Conway(1967)
中文直译大概的意思就是:
设计系统的组织,其产生的设计等同于组织之内、组织之间的沟通结构。
看看下面的图片,再想想 Apple 的产品、微软的产品设计,就能形象生动的理解这句话。
组织形式等同系统设计。
这里的系统按原作者的意思并不局限于软件系统。据说这篇文章最初投的哈佛商业评论,结果程序员屌丝的文章不入商业人士的法眼,无情被拒,康威就投到了一个编程相关的杂志,所以被误解为是针对软件开发的。最初这篇文章显然不敢自称定律(law),只是描述了作者自己的发现和总结。后来,在 Brooks Law 著名的人月神话中,引用这个论点,并将其“吹捧”成了现在我们熟知“康威定律”。
2
康威定律详细介绍
Mike 从他的角度归纳这篇论文中的其他一些核心观点,如下:
第一定律
- Communication dictates design- 组织沟通方式会通过系统设计表达出来第二定律
- There is never enough time to do something right, but there is always enough time to do it over- 时间再多一件事情也不可能做的完美,但总有时间做完一件事情第三定律
- There is a homomorphism from the linear graph of a system to the linear graph of its design organization- 线型系统和线型组织架构间有潜在的异质同态特性第四定律
- The structures of large systems tend to disintegrate during development, qualitatively more so than with small systems- 大的系统组织总是比小系统更倾向于分解3
定律说明
3.1
第一定律
人是复杂社会动物
组织的沟通和系统设计之间的紧密联系,在很多别的领域有类似的阐述。对于复杂的系统,聊设计就离不开聊人与人的沟通,解决好人与人的沟通问题,才能有一个好的系统设计。相信几乎每个程序员都读过的《人月神话》(1975 年,感觉都是老古董了,经典的就是经得起时间考验)里面许多观点都和这句话有异曲同工之妙。
Adding manpower to a late software project makes it later --Fred Brooks, (1975)
Boss 们都听到了吗?为了赶进度加程序员就像用水去灭油锅里的火一样(无奈大家还是前赴后继)。
为什么?人月神话也给出了很简洁的答案:沟通成本 = n(n-1)/2,沟通成本随着项目或者组织的人员增加呈指数级增长。是的,项目管理这个算法的复杂度是 O(n^2)。举个例子
5 个人的项目组,需要沟通的渠道是 5*(5–1)/2 = 10
15 个人的项目组,需要沟通的渠道是 15*(15–1)/2 = 105
50 个人的项目组,需要沟通的渠道是 50*(50–1)/2 = 1,225
150 个人的项目组,需要沟通的渠道是 150*(150–1)/2 = 11,175
所以知道为什么互联网创业公司都这么小了吧,必须小啊,不然等 CEO 和所有人讲一遍创业的想法后,风投的钱都烧完了。
Mike 还举了一个非常有意思的理论,叫“Dunbar Number”,这是一个叫 Dunbar(废话)生物学家在 1992 年最早提出来的。最初,他发现灵长类的大脑容量和其对应的族群大小有一定关联,进而推断出人类的大脑能维系的关系的一些有趣估计。举例来说
亲密(intimate)朋友: 5
信任(trusted)朋友: 15
酒肉(close)朋友: 35
照面(casual)朋友: 150
沟通的问题,会带来系统设计的问题,进而影响整个系统的开发效率和最终产品结果。
3.2
第二定律:
一口气吃不成胖子,先搞定能搞定的。
Eric Hollnagel 是敏捷开发社区的泰斗之一,在他《Efficiency-Effectiveness Trade Offs》 一书中解释了类似的论点。
Problem too complicated? Ignore details.
Not enough resources?Give up features.--Eric Hollnagel (2009)
其实我们在日常开发中也经常碰到。产品经理的需求太复杂了?适当忽略一些细节,先抓主线。产品经理的需求太多了?放弃一些功能。
据说 Eric 被一家航空公司请去做安全咨询顾问,复杂保证飞机飞行系统的稳定性和安全性。Eric 认为做到安全有两种方式:
常规的安全指的是尽可能多的发现并消除错误的部分,达到绝对安全,这是理想。
另一种则是弹性安全,即使发生错误,只要及时恢复,也能正常工作,这是现实。
对于飞机这样的复杂系统,再牛逼的人也无法考虑到漏洞的方方面面,所以 Eric 建议放弃打造完美系统的想法,而是通过不断的试飞,发现问题,确保问题发生时,系统能自动复原即可,而不追求飞行系统的绝对正确和安全。
下面的图很好的解释了这个过程:
另一方面,这和互联网公司维护的分布式系统的弹性设计也是一个道理。对于一个分布式系统,我们几乎永远不可能找到并修复所有的 bug,单元测试覆盖 1000%也没有用,错误流淌在分布式系统的血液里。解决方法不是消灭这些问题,而是容忍这些问题,在问题发生时,能自动回复,微服务组成的系统,每一个微服务都可能挂掉,这是常态,我们只有有足够的冗余和备份即可。即所谓的 弹性设计(Resilience) 或者叫高可用设计(High Availability)。
3.3
第三定律
种瓜得瓜,做独立自治的字系统减少沟通成本
3.4
第四定律
合久必分,分而治之
前面说了,人是复杂的社会动物,人与人的通过非常复杂。但是当我们面对复杂系统时,又往往只能通过增加人力来解决。这时,我们的组织一般是如何解决这个沟通问题的呢?Divide and conquer,分而治之。大家看看自己的公司的组织,是不是一个一线经理一般都是管理 15 个人以下的?二线经理再管理更少的一线?三线再管理更少的,以此类推。(这里完全没有暗示开发经理比程序猿更难管理)
所以,一个大的组织因为沟通成本/管理问题,总为被拆分成一个个小团队。
创业的想法太好了,反正风投钱多,多招点程序猿
人多管不过来啊,找几个经理帮我管,我管经理
最后, 康威定律 告诉我们组织沟通的方式会在系统设计上有所表达,每个经理都被赋予一定的职责去做大系统的某一小部分,他们和大系统便有了沟通的边界,所以大的系统也会因此被拆分成一个个小团队负责的小系统(微服务是一种好的模式)
4
康威定律如何解释微服务的合理性
了解了康威定律是什么,再来看看他如何在半个世纪前就奠定了微服务架构的理论基础。
人与人的沟通是非常复杂的,一个人的沟通精力是有限的,所以当问题太复杂需要很多人解决的时候,我们需要做拆分组织来达成对沟通效率的管理
组织内人与人的沟通方式决定了他们参与的系统设计,管理者可以通过不同的拆分方式带来不同的团队间沟通方式,从而影响系统设计
如果子系统是内聚的,和外部的沟通边界是明确的,能降低沟通成本,对应的设计也会更合理高效
复杂的系统需要通过容错弹性的方式持续优化,不要指望一个大而全的设计或架构,好的架构和设计都是慢慢迭代出来的
带来的具体的实践建议是:
我们要用一切手段提升沟通效率,比如 slack,github,wiki。能 2 个人讲清楚的事情,就不要拉更多人,每个人每个系统都有明确的分工,出了问题知道马上找谁,避免踢皮球的问题。
通过 MVP 的方式来设计系统,通过不断的迭代来验证优化,系统应该是弹性设计的。
你想要什么样的系统设计,就架构什么样的团队,能扁平化就扁平化。最好按业务来划分团队,这样能让团队自然的自治内聚,明确的业务边界会减少和外部的沟通成本,每个小团队都对自己的模块的整个生命周期负责,没有边界不清,没有无效的扯皮,inter-operate, not integrate。
做小而美的团队,人多会带来沟通的成本,让效率下降。亚马逊的 Bezos 有个逗趣的比喻,如果 2 个披萨不够一个团队吃的,那么这个团队就太大了。事实上一般一个互联网公司小产品的团队差不多就是 7,8 人左右(包含前后端测试交互用研等,可能身兼数职)。
再对应下衡量微服务的标准,我们很容易会发现他们之间的密切关系:
分布式服务组成的系统
按照业务而不是技术来划分组织
做有生命的产品而不是项目
Smart endpoints and dumb pipes(我的理解是强服务个体和弱通信)
自动化运维(DevOps)
容错
快速演化
原文出处: https://yq.aliyun.com/articles/8611
想要加入中生代架构群的小伙伴,请添加群合伙人大白的微信
申请备注(姓名+公司+技术方向)才能通过哦!
END
#接力技术,链接价值#
精彩推荐
4. 胡忠想|微博微服务架构的Service Mesh实践之路
漫画推荐